

#include <stdio.h> //定义一个头文件
// 使用枚举类型State来表示当前的状态
enum State { 
    NORMAL,    // 表示正常运行
    LINE_COMMENT,   // 表示单行注释
    PARAGRAPH_COMMENT   // 表示多行注释
};
// 定义一个int型的main函数为
int main() {
    FILE* fp; // 定义一个指针
    char ch, prev_ch;  // 定义两个字符型的变量
     // 定义一个枚举型的变量state初始化为NORMAL
    enum State state = NORMAL; 
    // 使用fopen函数打开一个源文件
    fp = fopen("/workspace/CProject/01byyl/input.c", "r");
    // 如果文件打开失败则会输出错误信息并退出程序
    if (fp == NULL) {
        printf("Error opening file\n");
        return 1;
    }
    // 使用fgetc函数逐个读取源文件中的字符
    while ((ch = fgetc(fp)) != EOF) {
        // 如果当前状态是NORMAL
        if (state == NORMAL) {
            // 判断读取到的字符是否为/
            if (ch == '/') {
                prev_ch = ch;  //赋值给新的字符变量
                ch = fgetc(fp); // 继续读取
                // 如果第二个字符还是为/,则表示进入了单行注释
                if (ch == '/') {
                    state = LINE_COMMENT;  // 则把LINE_COMMENT赋值给state
                  // 又如果下一个字符为*，则表示进入了多行注释
                } else if (ch == '*') {
                    state = PARAGRAPH_COMMENT;  // 把PARAGRAPH_COMMENT赋值给state
                    // 上述情况都不是的话，就输出这两个字符
                } else {
                    putchar(prev_ch);
                    putchar(ch);
                }
                // 如果读取到的字符不是/的话就直接输出这个字符
            } else {
                putchar(ch);
            }
            // 如果state状态为单行注释
        } else if (state == LINE_COMMENT) {
            // 如果读取 为\n，则表示单行注释结束
            if (ch == '\n') {
                state = NORMAL; // 则表示为正常运行
                putchar(ch); //输出ch
            }
            // 如果为多行注释
        } else if (state == PARAGRAPH_COMMENT) {
            // 如果ch为/且前一个字符为*，则表示多行注释结束
            if (prev_ch == '*' && ch == '/') {
                state = NORMAL;  // 把NORMAL赋值给state，不输出值
            }
        }
        prev_ch = ch;// 用于记录上一个读取到的字符
    }
    fclose(fp); // 关闭文件
    return 0;
}